/*
 * Copyright 2002-2009 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.core.type.classreading;

import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;

/**
 * Simple facade for accessing class metadata,
 * as read by an ASM {@link org.springframework.asm.ClassReader}.
 *
 * @author Juergen Hoeller
 * @since 2.5
 */

/**
 MetadataReader 接口是访问类元数据的简单门面，通过ASM ClassReader 读取：
	 Resource getResource(): 返回类文件的资源引用
	 ClassMetadata getClassMetadata(): 读取底层类的基本类元数据
	 AnnotationMetadata getAnnotationMetadata(): 读取底层类的完整注解元数据，包括注解方法的元数据
 2. 继承树和实现类
 	MetadataReader 是一个接口，没有父接口，其主要实现类为：
 实现类：
 	SimpleMetadataReader：MetadataReader 的简单实现，使用ASM ClassReader 读取类元数据
 3. 与其他类和接口的关系
	 与 ClassMetadata：通过 getClassMetadata() 方法提供类的基本元数据访问
	 与 AnnotationMetadata：通过 getAnnotationMetadata() 方法提供类的注解元数据访问
	 与 Resource：通过 getResource() 方法提供类文件的资源引用
	 与 SimpleMetadataReader：实现关系，是其主要实现
	 与ASM ClassReader：内部使用ASM ClassReader 读取类的字节码信息
	 与 MetadataReaderFactory：工厂关系，MetadataReaderFactory 创建 MetadataReader 实例
 4. 总结
 	MetadataReader 是Spring框架中用于读取类元数据的门面接口。它提供了一种高效的方式，通过ASM字节码分析技术在不加载类到JVM的情况下读取类的结构信息和注解信息。该接口将类文件作为资源处理，提供了获取基本类元数据(ClassMetadata)和完整注解元数据(AnnotationMetadata)的方法，是Spring类路径扫描功能的核心组件之一。
 5. 应用场景
	 类路径扫描：Spring的组件扫描功能使用 MetadataReader 读取类文件中的元数据，而无需加载类到JVM
	 条件注解处理：在 @Conditional 注解评估中使用，根据类元数据决定是否加载配置
	 自动配置：Spring Boot的自动配置机制使用 MetadataReader 快速分析类的结构和注解
	 AOP处理：在确定哪些类需要代理时，使用 MetadataReader 分析类的注解信息
	 性能优化：避免了在扫描阶段加载所有类到JVM，显著提高了类路径扫描的性能
	 框架内部使用：Spring框架内部广泛使用 MetadataReader 处理类元数据，如 ClassPathScanningCandidateComponentProvider 等
	 这些应用场景都利用了 MetadataReader 在不加载类的情况下读取类元数据的能力，提高了框架的性能和内存效率。
 */
public interface MetadataReader {

	/**
	 * Return the resource reference for the class file.
	 */
	Resource getResource();

	/**
	 * Read basic class metadata for the underlying class.
	 */
	ClassMetadata getClassMetadata();

	/**
	 * Read full annotation metadata for the underlying class,
	 * including metadata for annotated methods.
	 */
	AnnotationMetadata getAnnotationMetadata();

}
